home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 9.1 KB | 233 lines | [TEXT/CCL2] |
- ;;; File: ast/definitions.scm Author: John
-
- ;;; this file contains definitions for the named entities in the
- ;;; system. These are used in both the front and back ends of the
- ;;; compiler. These are created early in the compilation process
- ;;; (import/export) and filled in during compilation. Binary interface
- ;;; files are just tables mapping names to definitions.
-
- ;;; All definitions have these fields for managing name spaces. All
- ;;; names are uniquified; this requires adding `;' to the front of data
- ;;; constructors to separate them from type constructors. Module names
- ;;; do not have a `definition' data structure - the `module' structure
- ;;; serves the same purpose.
-
- ;;; Definitions are found in two places: the symbol tables which are part of
- ;;; the module structure and the -ref nodes in the ast structure. The -ref
- ;;; nodes have two fields: a name (from the parser) and a field which will
- ;;; point to the associated definition after name resolution. Name resolution
- ;;; happens in a number of different places: top level definitions are
- ;;; resolved during import-export, type declarations are resolved during
- ;;; type declaration analysis, and everything else is resolved during scoping
- ;;; (alpha conversion). The parser generates pre-resolved -ref nodes when
- ;;; parsing some constructs. These refs denote pre-defined language
- ;;; constructs, such as lists, tuples, or prelude functions.
-
- ;;; A special set of definitions constitutes the `core' of Haskell. These
- ;;; definitions are pre-allocated and are filled in during the compilation
- ;;; of the Prelude. This allows the bootstrap of the system.
-
-
- ;;; All defs require name, unit, and module args to make.
- ;;; Other slots should all have appropriate defaults.
-
- (define-struct def
- (slots
- ;; the uniquified name (from the definition)
- (name (type symbol))
- ;; compilation unit defined in
- (unit (type symbol))
- ;; name of the defining module
- (module (type symbol))
- ;; used by the closure check
- (exported? (type bool) (default '#f) (bit #t))
- ;; for symbols in `core' Haskell; special case for IO
- (core? (type bool) (default '#f) (bit #t))
- ;; Always a core sym. Used to avoid putting in sym table
- (prelude? (type bool) (default '#f) (bit #t))
- ;; True when the def is created by an interface
- (interface? (type bool) (default '#f) (bit #t))
- ;; This is used by interface files. Once the real definition of a symbol
- ;; is available the interface file symbol is forwarded to the real thing.
- (forward-to (type (maybe def)) (default '#f))
- (where-defined (type (maybe source-pointer)) (default '#f))
- ))
-
- ;;; Variable information
-
- (define-struct var
- (include def)
- (predicate var?)
- (slots
- ;; inferred during type inference
- (type (type (maybe ntype)) (default '#f))
- ;; type affixed by sign-decl or class decl
- (signature (type (maybe ntype)) (default '#f))
- ;; most variables have no fixity information.
- (fixity (type (maybe fixity)) (default '#f))
- ;; The following attributes are used by the backend
- (selector-fn? (type bool) (default '#f) (bit #t))
- (force-strict? (type bool) (default '#f) (bit #t))
- (inline? (type bool) (default '#f) (bit #t))
- (always-inline? (type bool) (default '#f) (bit #t))
- (toplevel? (type bool) (default '#f) (bit #t))
- (simple? (type bool) (default '#f) (bit #t))
- (strict? (type bool) (default '#f) (bit #t))
- (optimized-refs? (type bool) (default '#f) (bit #t))
- (standard-refs? (type bool) (default '#f) (bit #t))
- (single-ref (type (maybe int)) (default '#f))
- (arity (type int) (default 0))
- (referenced (type int) (default 0))
- (value (type (maybe flic-exp)) (default '#f))
- (fullname (type (maybe symbol)) (default '#f))
- (inline-value (type (maybe flic-exp)) (default '#f))
- ;; Only function bindings use these slots
- (strictness (type (list bool)) (default '()))
- (complexity (type (maybe int)) (default '#f))
- (optimized-entry (type (maybe symbol)) (default '#f))
- (annotations (type (list annotation-value)) (default '()))
- (fn-referenced (type int) (default 0))
- (specializers (type (list (tuple def t))) (default '()))
- (arg-invariant-value (type (maybe flic-exp)) (default '#f))
- (arg-invariant? (type bool) (default '#f) (bit #t))
- ))
-
-
- ;;; This defines an individual class method
-
- (define-struct method-var
- (include var)
- (predicate method-var?)
- (slots
- (class (type class) (uninitialized? #t))
- (default (type (maybe var)) (uninitialized? #t))
- (method-signature (type signature) (uninitialized? #t))))
-
-
- ;;; A data constructor
-
- (define-struct con
- (include def)
- (predicate con?)
- (slots
- ;; These slots are initialized in the type declaration phase
- (arity (type int) (uninitialized? #t))
- (types (type (list type)) (uninitialized? #t))
- (slot-strict? (type (list bool)) (default '()))
- (tag (type int) (uninitialized? #t))
- (alg (type algdata) (uninitialized? #t))
- (infix? (type bool) (bit #t) (default '#f))
- (signature (type ntype) (uninitialized? #t))
- ;; Assigned during import-export phase
- (fixity (type (maybe fixity)) (default '#f))
- (lisp-fns (type t) (default '()))
- ))
-
-
- ;;; Definitions used by the type system.
-
- (define-struct tycon-def
- (include def)
- (slots
- (arity (type integer) (default -1))))
-
- (define-struct synonym
- (include tycon-def)
- (predicate synonym?)
- (slots
- ;; These slots are explicitly initialized in the type declaration phase.
- (args (type (list symbol)) (uninitialized? #t))
- (body (type type) (uninitialized? #t)) ; stored in ast form
- ))
-
- (define-struct algdata
- (include tycon-def)
- (predicate algdata?)
- (slots
- ;; These slots are initialized explicitly in the type declaration phase
- ;; number of constructors
- (n-constr (type int) (uninitialized? #t))
- (constrs (type (list con)) (uninitialized? #t))
- (context (type (list context)) (uninitialized? #t))
- ;; arguments to tycon
- (tyvars (type (list symbol)) (uninitialized? #t))
- ;; signature for the type as a whole
- (signature (type (maybe ntype)) (default '#f))
- ;; classes this algdata is an instance of
- (classes (type (list class)) (uninitialized? #t))
- ;; true if all constructors have 0 arity
- (enum? (type bool) (bit #t) (uninitialized? #t))
- ;; true when only constructor
- (tuple? (type bool) (bit #t) (uninitialized? #t))
- ;; true for `tuple-syntax' tuples.
- (real-tuple? (type bool) (bit #t) (uninitialized? #t))
- ;; instances to derive
- (deriving (type (list class)) (uninitialized? #t))
- (export-to-lisp? (type bool) (default '#f) (bit #t))
- (implemented-by-lisp? (type bool) (default '#f) (bit #t))
- (skolem-type? (type bool) (default '#f) (bit #t))
- (runtime-var (type var) (uninitialized? #t))
- ))
-
- (define-struct class
- (include def)
- (predicate class?)
- (slots
- ;; These slots are initialized in the import-export phase
- (method-vars (type (list method-var)) (uninitialized? #t))
- ;; These slots are explicitly initialized in the type declaration phase
- ;; immediate superclasses
- (super (type (list class)) (uninitialized? #t))
- ;; all superclasses
- (super* (type (list class)) (uninitialized? #t))
- ;; name of class type variable
- (tyvar (type symbol) (uninitialized? #t))
- (instances (type (list instance)) (uninitialized? #t))
- (kind (type (enum standard numeric other)) (uninitialized? #t))
- (n-methods (type int) (uninitialized? #t))
- (dict-size (type int) (uninitialized? #t))
- (selectors (type (list (tuple method-var var))) (uninitialized? #t))
- (runtime-var (type var) (uninitialized? #t))
- ))
-
- ;;; Since instances are not named there is no need to include def.
-
- (define-struct instance
- (include ast-node)
- (predicate instance?)
- (slots
- ;; These slots always have initializers supplied with MAKE.
- (algdata (type algdata))
- (tyvars (type (list symbol)))
- (class (type class))
- (context (type (list context)))
- (gcontext (type (list (list class))))
- (dictionary (type def))
-
- ;; Explicitly initialized during the type declaration phase.
- (methods (type (list (tuple method-var var))) (uninitialized? #t))
-
- ;; These slots usually default on creation.
- (decls (type (list decl)) (default '()))
- ;; used during verification of derived instances
- (ok? (type bool) (bit #t) (default #f))
- ;; marks magically generated tuple instances
- (special? (type bool) (bit #t) (default #f))
- (skolem-inst? (type bool) (bit #t) (default #f))
- ;; marks instances defined in interfaces.
- (in-interface? (type bool) (bit #t) (default #f))
- (runtime-var (type var) (uninitialized? #t))
- ))
-
- ;;; This is used for the deriving extension to Yale Haskell
-
- (define-struct deriving
- (include def)
- (slots
- (preconditions (type (list class)) (default '()))
- (tyvar (type symbol) (uninitialized? #t))
- (instances (type (list instance-decl)) (default '()))))
-
-
-
-